/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.view.proceso6.ordenServicio;

import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import javax.swing.table.DefaultTableModel;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

import com.action.proceso4.UnidadMedidaAction;
import com.action.proceso5.ProveedorAction;
import com.action.proceso6.ItemOrdenAction;
import com.action.proceso6.OrdenDeServicioAction;
import com.action.proceso6.OrdenDeServicioItemOrdenAction;
import com.bean.proceso4.UnidadMedida;
import com.bean.proceso5.Proveedor;
import com.bean.proceso6.ItemOrden;
import com.bean.proceso6.OrdenDeServicio;
import com.bean.proceso6.OrdenDeServicioItemOrden;
import com.conexion.DbConnection;
import com.util.EnvioCorreo;
import com.util.Util;
import javax.swing.JLabel;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 * 
 * @author sophia
 */
public class jifrmOrdenServicio extends javax.swing.JInternalFrame {

	private javax.swing.JButton btnGuardar;
	private javax.swing.JButton btnEliminar;
	private javax.swing.JComboBox cboProveedor;
	private com.toedter.calendar.JDateChooser cdlFecha;
	private javax.swing.JLabel jLabel1;
	private javax.swing.JLabel jLabel2;
	private javax.swing.JLabel jLabel3;
	private javax.swing.JLabel jLabel7;
	private javax.swing.JPanel jPanel1;
	private javax.swing.JPanel jPanel3;
	private javax.swing.JPanel jPanel4;
	private javax.swing.JScrollPane jScrollPane2;
	private javax.swing.JScrollPane jScrollPane3;
	private javax.swing.JTable tlbItems;
	private javax.swing.JTable tlbRegistroOrdenServicio;
	private javax.swing.JTextField txtCodigo;
	private javax.swing.JTextArea txtObservaciones;
	private OrdenDeServicioAction osa;
	private OrdenDeServicioItemOrdenAction osaia;
	private ItemOrdenAction ioa;
	private UnidadMedidaAction udma;
	private ProveedorAction pa;

	private JPanel panel;
	private JPanel panel_1;
	private JTextField txtTotal;
	private JMenuItem mntmAgregarALa;
	private JMenuItem mntmAgregarALb;

	DecimalFormatSymbols simbolos;
	DecimalFormat df;
	private JLabel lblFiltroPorCdigo;
	private JTextField txtBusqueda;

	public jifrmOrdenServicio() {
		osa = new OrdenDeServicioAction();
		osaia = new OrdenDeServicioItemOrdenAction();
		ioa = new ItemOrdenAction();
		udma = new UnidadMedidaAction();
		pa = new ProveedorAction();

		initComponents();

		simbolos = new DecimalFormatSymbols();
		simbolos.setDecimalSeparator('.');
		df = new DecimalFormat("#####.00", simbolos);

		addInternalFrameListener(new InternalFrameAdapter() {
			@Override
			public void internalFrameOpened(InternalFrameEvent arg0) {
				txtCodigo.setText(Util.generaCodigo(Util.ORDEN_SERVICIO));
				llenarComboProveedores();
			}
		});
		setTitle("Mantenimiento de Ordenes de Servicio");
		setIconifiable(true);
		setClosable(true);

		listarTabla();

	}

	protected void llenarComboProveedores() {
		ArrayList<Proveedor> ap = new ProveedorAction().listar();

		for (Proveedor p : ap) {
			cboProveedor.addItem(p.getRazonSocial());
		}

	}

	private void initComponents() {

		jPanel1 = new javax.swing.JPanel();
		jLabel1 = new javax.swing.JLabel();
		jLabel2 = new javax.swing.JLabel();
		jLabel3 = new javax.swing.JLabel();
		jLabel7 = new javax.swing.JLabel();
		txtCodigo = new javax.swing.JTextField();
		txtCodigo.setHorizontalAlignment(SwingConstants.CENTER);
		txtCodigo.setFont(new Font("Tahoma", Font.BOLD, 11));
		txtCodigo.setForeground(Color.RED);
		cdlFecha = new com.toedter.calendar.JDateChooser();
		cdlFecha.setCalendar((Calendar) GregorianCalendar.getInstance());
		cboProveedor = new javax.swing.JComboBox();
		jPanel3 = new javax.swing.JPanel();
		setPreferredSize(new Dimension(810, 580));
		getContentPane().setLayout(null);

		jPanel1.setBorder(javax.swing.BorderFactory
				.createTitledBorder("Datos Orden de Servicio"));
		jPanel1.setLayout(null);

		jLabel1.setText("C�digo");
		jPanel1.add(jLabel1);
		jLabel1.setBounds(20, 21, 66, 14);

		jLabel2.setText("Fecha");
		jPanel1.add(jLabel2);
		jLabel2.setBounds(20, 70, 66, 14);

		jLabel3.setText("Proveedor");
		jPanel1.add(jLabel3);
		jLabel3.setBounds(207, 21, 88, 14);

		jLabel7.setText("Total");
		jPanel1.add(jLabel7);
		jLabel7.setBounds(207, 70, 66, 14);

		txtCodigo.setEditable(false);
		jPanel1.add(txtCodigo);
		txtCodigo.setBounds(20, 39, 153, 20);
		jPanel1.add(cdlFecha);
		cdlFecha.setBounds(20, 88, 153, 20);
		jPanel1.add(cboProveedor);
		cboProveedor.setBounds(207, 39, 177, 20);

		getContentPane().add(jPanel1);
		jPanel1.setBounds(10, 11, 682, 130);
		txtObservaciones = new javax.swing.JTextArea();
		txtObservaciones.setBounds(408, 23, 264, 98);
		jPanel1.add(txtObservaciones);

		txtObservaciones.setColumns(20);
		txtObservaciones.setRows(5);
		txtObservaciones.setBorder(javax.swing.BorderFactory
				.createTitledBorder("Observaciones"));

		txtTotal = new JTextField();
		txtTotal.setHorizontalAlignment(SwingConstants.RIGHT);
		txtTotal.setEditable(false);
		txtTotal.setText("0.00");
		txtTotal.setBounds(207, 88, 177, 20);
		jPanel1.add(txtTotal);
		txtTotal.setColumns(10);

		jPanel3.setBorder(javax.swing.BorderFactory
				.createTitledBorder("Registro Orden de Servicio"));
		jPanel3.setLayout(new BoxLayout(jPanel3, BoxLayout.X_AXIS));

		getContentPane().add(jPanel3);
		jPanel3.setBounds(10, 364, 785, 226);
		jScrollPane3 = new javax.swing.JScrollPane();
		jPanel3.add(jScrollPane3);
		tlbRegistroOrdenServicio = new javax.swing.JTable();
		tlbRegistroOrdenServicio.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				int row = tlbRegistroOrdenServicio.getSelectedRow();
				if (row >= 0) {
					btnEliminar.setEnabled(true);
					String codigo = (String) tlbRegistroOrdenServicio
							.getValueAt(row, 0);
					OrdenDeServicio ods = osa.buscar(codigo);

					txtCodigo.setText(codigo);

					try {
						String fecha = ods.getFecha();
						SimpleDateFormat sdf = new SimpleDateFormat(
								"yyyy-MM-dd");
						Date dfecha = sdf.parse(fecha);
						Calendar cfecha = GregorianCalendar.getInstance();
						cfecha.setTime(dfecha);
						cdlFecha.setCalendar(cfecha);
					} catch (ParseException e) {
						e.printStackTrace();
					}

					cboProveedor
							.setSelectedItem((String) tlbRegistroOrdenServicio
									.getValueAt(row, 2));

					txtObservaciones.setText(ods.getObservaciones());

					txtTotal.setText(String.format(df.format(ods.getTotal())));

					listarItems(ods.getCodigo());
				}

			}
			@Override
			public void mouseReleased(MouseEvent e) {
				clickDerechoTabla(e);
			}

		});

		tlbRegistroOrdenServicio.setModel(new DefaultTableModel(
				new Object[][]{}, new String[]{"Codigo", "Fecha", "Proveedor",
						"Total"}));
		jScrollPane3.setViewportView(tlbRegistroOrdenServicio);
		jPanel4 = new javax.swing.JPanel();
		jPanel4.setBounds(5, 152, 706, 155);
		getContentPane().add(jPanel4);
		jScrollPane2 = new javax.swing.JScrollPane();
		tlbItems = new javax.swing.JTable();

		jPanel4.setBorder(javax.swing.BorderFactory
				.createTitledBorder("Productos"));
		jPanel4.setLayout(new BoxLayout(jPanel4, BoxLayout.X_AXIS));

		tlbItems.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
		tlbItems.setModel(new DefaultTableModel(new Object[][]{}, new String[]{
				"Codigo", "Descripcion", "Unidad de Medida", "Cantidad",
				"Costo"}));
		jScrollPane2.setViewportView(tlbItems);

		jPanel4.add(jScrollPane2);

		panel = new JPanel();
		panel.setBounds(711, 184, 75, 97);
		getContentPane().add(panel);
		FlowLayout fl_panel = new FlowLayout(FlowLayout.CENTER, 5, 5);
		panel.setLayout(fl_panel);

		JButton btnAnadirItem = new JButton("");
		panel.add(btnAnadirItem);
		btnAnadirItem.setToolTipText("A\u00F1adir Item");
		btnAnadirItem.setIcon(new ImageIcon(jifrmOrdenServicio.class
				.getResource("/Imagenes/imgA\u00F1adir (2).png")));

		JButton btnQuitarItem = new JButton("");
		btnQuitarItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				quitarItem(e);
			}
		});
		panel.add(btnQuitarItem);
		btnQuitarItem.setIcon(new ImageIcon(jifrmOrdenServicio.class
				.getResource("/Imagenes/imgQuitar.png")));
		btnQuitarItem.setToolTipText("Quitar Item");

		panel_1 = new JPanel();
		panel_1.setBounds(702, 11, 84, 135);
		getContentPane().add(panel_1);
		panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 3, 3));
		btnGuardar = new javax.swing.JButton();
		panel_1.add(btnGuardar);
		btnGuardar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {

				guardar();

			}
		});

		btnGuardar.setIcon(new ImageIcon(jifrmOrdenServicio.class
				.getResource("/Imagenes/imgRegistrar.png")));
		btnGuardar.setToolTipText("Guardar");

		JButton btnNuevo = new JButton("");
		btnNuevo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				nuevo(e);
			}
		});
		panel_1.add(btnNuevo);
		btnNuevo.setToolTipText("Nuevo registro");
		btnNuevo.setIcon(new ImageIcon(jifrmOrdenServicio.class
				.getResource("/Imagenes/imgNuevo.png")));
		btnEliminar = new javax.swing.JButton();
		btnEliminar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				eliminar(arg0);

			}
		});
		panel_1.add(btnEliminar);
		btnEliminar.setEnabled(false);

		btnEliminar.setIcon(new ImageIcon(jifrmOrdenServicio.class
				.getResource("/Imagenes/imgEliminar.png")));
		btnEliminar.setToolTipText("Eliminar");

		JSeparator separator = new JSeparator();
		separator.setBounds(10, 318, 785, 2);
		getContentPane().add(separator);

		lblFiltroPorCdigo = new JLabel("Filtro por C\u00F3digo:");
		lblFiltroPorCdigo.setBounds(189, 336, 107, 14);
		getContentPane().add(lblFiltroPorCdigo);

		txtBusqueda = new JTextField();
		txtBusqueda.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent arg0) {
				buscarOS(arg0);
			}
		});
		txtBusqueda.setBounds(306, 333, 257, 20);
		getContentPane().add(txtBusqueda);
		txtBusqueda.setColumns(10);
		btnAnadirItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				clickAgregarItem();
			}
		});

		pack();
	}

	protected void buscarOS(KeyEvent arg0) {
		if (txtBusqueda.getText().trim().isEmpty()) {
			listarTabla();
		} else {
			ListarTablaOrdenServicioBusqueda ltos = new ListarTablaOrdenServicioBusqueda(
					tlbRegistroOrdenServicio, txtBusqueda.getText().trim());
			Thread hilo = new Thread(ltos);
			hilo.start();
		}
	}
	protected void clickDerechoTabla(MouseEvent e) {
		if (e.getButton() == MouseEvent.BUTTON3) {
			JPopupMenu popupMenu = new JPopupMenu();

			int r = tlbRegistroOrdenServicio.rowAtPoint(e.getPoint());
			if (r >= 0 && r < tlbRegistroOrdenServicio.getRowCount())
				tlbRegistroOrdenServicio.setRowSelectionInterval(r, r);

			mntmAgregarALa = new JMenuItem("Preparar para enviar");
			mntmAgregarALb = new JMenuItem("Notificar al proveedor con la O/S");

			mntmAgregarALa.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent v) {

					if (tlbRegistroOrdenServicio.getSelectedRowCount() > 0) {
						int row = tlbRegistroOrdenServicio.getSelectedRow();

						String codigo = tlbRegistroOrdenServicio.getValueAt(
								row, 0).toString();

						String fileName = System.getProperty("user.dir")
								+ "/templates/templateOS.jasper";

						String fileLogo = System.getProperty("user.dir")
								+ "/templates/logo.jpg";

						JasperReport masterReport = null;
						try {
							masterReport = (JasperReport) JRLoader
									.loadObjectFromFile(fileName);

							Map parametro = new HashMap();

							parametro.put("parOSCodigo", codigo);
							parametro.put("PATH_LOGO", fileLogo);

							JasperPrint jp = JasperFillManager.fillReport(
									masterReport, parametro,
									DbConnection.getConnection());
							JasperViewer viewer = new JasperViewer(jp, false);
							viewer.setTitle("Orden de Servicio " + codigo);
							viewer.setVisible(true);
						} catch (JRException ex) {
							Util.Mensaje(null, ex.getMessage(), Util.ERRROR);
						}
					}
				}

			});

			mntmAgregarALb.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent v) {

					if (tlbRegistroOrdenServicio.getSelectedRowCount() > 0) {
						int row = tlbRegistroOrdenServicio.getSelectedRow();

						String codigo = tlbRegistroOrdenServicio.getValueAt(
								row, 0).toString();

						String fileLogo = System.getProperty("user.dir")
								+ "/templates/logo.jpg";

						String fileName = System.getProperty("user.dir")
								+ "/templates/templateOC.jasper";

						JasperReport masterReport = null;
						try {
							masterReport = (JasperReport) JRLoader
									.loadObjectFromFile(fileName);

							Map parametro = new HashMap();

							parametro.put("parOCCodigo", codigo);
							parametro.put("PATH_LOGO", fileLogo);

							JasperPrint jp = JasperFillManager.fillReport(
									masterReport, parametro,
									DbConnection.getConnection());
							// JasperViewer viewer = new JasperViewer(jp,
							// false);
							// viewer.setTitle("Orden de compra " + codigo);
							// viewer.setVisible(true);

							String pathReporte = System.getProperty("user.dir")
									+ "/templates/reportes/" + codigo + ".pdf";

							JasperExportManager.exportReportToPdfFile(jp,
									pathReporte);

							Proveedor proveedor = pa
									.buscarRS(tlbRegistroOrdenServicio
											.getValueAt(row, 2).toString());

							try {

								EnvioCorreo ec = new EnvioCorreo(pathReporte,
										"Servicio", proveedor, "");
								ec.start();
								Util.Mensaje(
										null,
										"Se envio un correo con la orden adjunta",
										Util.CONFIRMACION);
							} catch (Exception ex) {
								Util.Mensaje(
										null,
										"No se pudo enviar un correo con la orden adjunta",
										Util.ERRROR);
							}
						} catch (JRException ex) {
							Util.Mensaje(null, ex.getMessage(), Util.ERRROR);
						}
					}
				}

			});

			popupMenu.add(mntmAgregarALa);
			popupMenu.add(mntmAgregarALb);
			popupMenu.show(tlbRegistroOrdenServicio, e.getX(), e.getY());
		}

	}

	protected void eliminar(ActionEvent arg0) {

		btnEliminar.setEnabled(false);
		String codigo = txtCodigo.getText();
		int resultado1 = osaia.eliminar(codigo);
		int resultado2 = osa.eliminar(codigo);

		if (resultado1 > 0 && resultado2 > 0) {
			Util.Mensaje(null, "Se elimin� la Orden de Servicio",
					Util.CONFIRMACION);
		} else {
			Util.Mensaje(null, "No se pudo eliminar la Orden de Servicio",
					Util.ERRROR);
		}
		borrarCampos();
		listarTabla();

	}

	protected void nuevo(ActionEvent e) {
		borrarCampos();
	}

	protected void listarItems(String codigo) {
		ArrayList<OrdenDeServicioItemOrden> items = osaia.listar(codigo);

		DefaultTableModel m = (DefaultTableModel) tlbItems.getModel();
		m.setRowCount(0);
		String unidad;
		for (OrdenDeServicioItemOrden o : items) {
			ItemOrden io = ioa.buscar(o.getItemorden_id());

			UnidadMedida u = udma.buscarXCodigo(io.getUnidadmedida());

			Object[] rowData = {io.getCodigo(), io.getDescripcion(),
					u.getDescripcion(), io.getCosto()};
			m.addRow(rowData);
		}

	}
	protected void quitarItem(ActionEvent e) {
		if (tlbItems.getSelectedRowCount() > 0) {
			int row = tlbItems.getSelectedRow();
			DefaultTableModel m = (DefaultTableModel) tlbItems.getModel();
			double t = Double.parseDouble(txtTotal.getText())
					- Double.parseDouble(tlbItems.getValueAt(row, 4).toString());
			txtTotal.setText(df.format(t));
			m.removeRow(row);
		}

	}
	protected void clickAgregarItem() {
		frmOrdenServicioItem f = new frmOrdenServicioItem(tlbItems, txtTotal);
		Container c = this.getParent();
		c.add(f);
		f.show();
	}

	protected void guardar() {

		StringBuilder sb = new StringBuilder();
		String cad;
		int resultado = -1;

		String codigo = txtCodigo.getText();

		String proveedor = cboProveedor.getSelectedItem().toString();
		cad = Util.Validar(proveedor, Util.CADENA_VACIA,
				"Seleccione un Proveedor antes de Guardar.\n");
		if (!cad.isEmpty())
			sb.append(cad);

		Calendar cfecha = cdlFecha.getCalendar();
		Date dfecha = cfecha.getTime();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
		String fecha = sdf.format(dfecha);

		cad = Util.Validar(fecha, Util.FECHA, "fecha inv�lida.\n");
		if (!cad.isEmpty())
			sb.append(cad);

		if (txtTotal.getText().equals("0.00")) {
			cad = "Debe de agregar items de servicio a la orden antes de guardarla";
		} else
			cad = "";
		if (!cad.isEmpty())
			sb.append(cad);

		String observaciones = txtObservaciones.getText();

		double total = Double.parseDouble(txtTotal.getText());

		if (sb.toString().length() > 0) {
			JOptionPane.showMessageDialog(null, sb.toString());
		} else {

			OrdenDeServicio ordenDeServicio = osa.buscar(codigo);

			Proveedor p = pa.buscarRS(proveedor);

			OrdenDeServicio obj = new OrdenDeServicio(codigo, fecha,
					p.getRuc(), observaciones, total, "TR0005");

			DefaultTableModel m = (DefaultTableModel) tlbItems.getModel();
			ArrayList<OrdenDeServicioItemOrden> lista = new ArrayList<OrdenDeServicioItemOrden>();

			if (ordenDeServicio == null) {
				resultado = osa.insertar(obj);

				for (int i = 0; i < m.getRowCount(); i++) {
					lista.add(new OrdenDeServicioItemOrden(txtCodigo.getText(),
							(String) m.getValueAt(i, 0)));
				}

				resultado = osaia.insertar(lista);
			} else {
				resultado = osa.actualizar(obj);
				resultado = osaia.actualizar(lista);
			}

			if (resultado > 0) {
				borrarCampos();
				listarTabla();
				Util.Mensaje(null,
						"La orden de servicio se guard� correctamente.",
						Util.CONFIRMACION);
			} else {
				Util.Mensaje(null, "La orden de servicio  no se guard�.",
						Util.ERRROR);
			}

		}

	}
	private void listarTabla() {
		ListarTablaOrdenServicio ltos = new ListarTablaOrdenServicio(
				tlbRegistroOrdenServicio);
		Thread hilo = new Thread(ltos);
		hilo.start();

	}

	private void borrarCampos() {
		txtCodigo.setText(Util.generaCodigo(Util.ORDEN_SERVICIO));
		cboProveedor.setSelectedIndex(0);
		cdlFecha.setCalendar((Calendar) GregorianCalendar.getInstance());
		txtObservaciones.setText(null);
		txtTotal.setText("0.00");
		DefaultTableModel m = (DefaultTableModel) tlbItems.getModel();
		m.setRowCount(0);
	}
}
